<?php

require_once("BDD.php");
require_once("ClassPost.php");

class ClassUtilisateur
{
        ////////////////////
        //Properties
        ////////////////////

        public $ID;
        public $Nom;
        public $Prenom;
        public $Mail;
        public $dateNaissance;
        public $MotDePasse;
        public $Genre;
        public $InfosPersonnellesPublic;
        public $MurPublique;
        public $AffichePostAutreUtilisateur;
        public $LienPhoto;
            
        public $DEMANDE_AMI = 0;
        public $AMI = 1;
        
        
        
        ////////////////////
        //Fonctions instance
        ////////////////////

        /*
        Permet à l'utilisateur d'accepter une invitation d'ami.
        */
        public function AcceptContactInvitation($pID_Utilisateur)
        {
            $lSql = "UPDATE contacts SET Etat = '".$this->AMI."' WHERE ID_Contact = ".$this->ID." AND ID_Utilisateur = ".$pID_Utilisateur;
            $data = BDD::requete($lSql);
			
            return $data;	
        }
        
        /*
        Envoyer une invitation d'ami à une personne.
        */
        public function AddContactInvitation($pID_Utilisateur)
        {
           $lSql = "INSERT INTO contacts VALUES('".$this->ID."', '".$pID_Utilisateur."', '".$this->DEMANDE_AMI."')";										
           $data = BDD::requete($lSql);				
           return $data;
        }
		
        /*
        Refuse une invitation d'ami.
        */
        public function DenyContactInvitation($pID_Utilisateur)
        {
            $lSql = "DELETE FROM contacts WHERE ID_Contact = '".$this->ID."' AND ID_Utilisateur = '".$pID_Utilisateur."'";
            $data = BDD::requete($lSql);
            return $data;			 
        }
		
        /*
        Supprime un ami.
        */
        public function DeleteContact($pID_Utilisateur)
        {
            $lSql = "DELETE FROM contacts WHERE (ID_Contact = '".$this->ID."' AND ID_Utilisateur = '".$pID_Utilisateur."') OR (ID_Contact = '".$pID_Utilisateur."' AND ID_Utilisateur = '".$this->ID."')";
            $data = BDD::requete($lSql);			 
            return $data;
        }
		   
         /*
        Obtient la liste des utilisateurs qui on fait une demande d'ami.
        Retourne un array d'utilisateur.
        */
        public function GetContactsInvitation()
        {		
           return $this->GetContacts($this->DEMANDE_AMI);
        }
		
        /*
        Chargement tous les amis.
        Retourne un array d'utilisateur.
        */
        public function GetMyContacts()
        {		
           return $this->GetContacts($this->AMI);
        }
		
        private function GetContacts($pEtat)
        {		
           $lSql = "SELECT c.ID_Utilisateur as V FROM utilisateurs u ";
           $lSql .= "INNER JOIN `contacts` c ON u.ID = c.ID_Utilisateur ";
           $lSql .= "WHERE c.ID_Contact = '".$this->ID."' AND c.Etat = '".$pEtat."' ";
           $lSql .= "UNION ";
           $lSql .= "SELECT c.ID_Contact as V FROM utilisateurs u ";
           $lSql .= "INNER JOIN `contacts` c ON u.ID = c.ID_Utilisateur ";
           $lSql .= "WHERE c.ID_Utilisateur = '".$this->ID."' AND c.Etat = '".$pEtat."' ";  
           
			
           $data = BDD::requete($lSql);

           $lListUser = array();
			
			if($data == false)
				return $lListUser;
           
            while ($data != false && $item = mysql_fetch_array($data))
            {
               $lListUser[] = self::GetUtilisateurByID($item['V']);
            }
           
            return $lListUser;
        }
        
        /*
        Obtient une liste de personnes potentiellement ami.
        */
        public function SuggestionContacts($pNbSuggestion)
        {
           //recupere la liste des amis de l'utilisateur
              $data = $this->GetMyContacts();

           //recupere la liste des amis de nos amis
           $lFriendOfFriend = array();
           foreach($data as $user)
           {
				 foreach($user->GetMyContacts() as $amisdamis)
				{
					if($amisdamis->ID != $this->ID)
						$lFriendOfFriend[] = $amisdamis;
				}
           }
           //var_dump($lFriendOfFriend);
           //compte le nombre d'occurence des amis des amis
           $lNbOccurenceUser = array();
           foreach($lFriendOfFriend as $user)
           {			
              if (isset ($lNbOccurenceUser[$user->ID]))
                 $lNbOccurenceUser[$user->ID]++;
              else
                 $lNbOccurenceUser[$user->ID] = 1;
           }
           //var_dump($lNbOccurenceUser);
           //tri par nombre d'occurence
           //sort($lNbOccurenceUser, SORT_NUMERIC);
           //var_dump($lNbOccurenceUser);
           
           //recupere les x 1er amis du tableau
           //$lNbOccurenceUser = array_slice($lNbOccurenceUser, 0, $pNbSuggestion);
           
           //var_dump($lNbOccurenceUser);
           //retourne les utilisateurs selectionné
           $lTableauUser = array();
           foreach($lNbOccurenceUser as $key => $value)
           {			
				//echo $key;
              $lTableauUser[] = self::GetUtilisateurByID($key);
           }
           
           return $lTableauUser;
        }
		
		/*
		Obtient la liste des posts de l'ami spécifié.
		*/
		public function GetPostsContact($pID_Utilisateur)
		{
			$data = BDD::requete("SELECT * FROM posts WHERE ID_Expediteur=\"" . $pID_Utilisateur . "\" ORDER BY Date");
			
			$postsList = array();
			if ($data != false && $post = mysql_fetch_array($data))
			{
				$newPost = new classPost();
				$newPost->ID = $post["ID"];
				$newPost->ID_UtilisateurFrom = $post["ID_Expediteur"];
				$newPost->ID_UtilisateurTo = $post["ID_Destinataire"];
				$newPost->Date = $post["Date"];
				$newPost->Contenu = $post["Contenu"];
				$newPost->IsPublic = $post["Public"];
				$newPost->Lien = $post["Lien"];
				$postsList[] = $post;
			}
			
			return $postsList;
		}
		
		/*
		Obtient la liste des posts de tous les amis.
		*/
		public function GetPostsContacts()
		{
			$contactList = $this->GetMyContacts();
			$contactsIds = "(" . $this->ID;
			
			foreach ($contactList as $contact)
			{
				$contactsIds .= ", " . $contact->ID ;
			}
			
			$contactsIds .= ")";
			
			$data = BDD::requete("SELECT * FROM posts WHERE ID_Expediteur IN " . $contactsIds . " ORDER BY Date");
			
			$postsList = array();
			if ($data != false)
			{
                            while($post = mysql_fetch_array($data))
                            {
				$newPost = new classPost();
				$newPost->ID = $post["ID"];
				$newPost->ID_UtilisateurFrom = $post["ID_Expediteur"];
				$newPost->ID_UtilisateurTo = $post["ID_Destinataire"];
				$newPost->Date = $post["Date"];
				$newPost->Contenu = $post["Contenu"];
				$newPost->IsPublic = $post["Public"];
				$newPost->Lien = $post["Lien"];
				$postsList[] = $newPost;
                            }
			}
			
			return $postsList;
		}

        
        
        
        ////////////////////
        //Fonctions statiques
        ////////////////////
                
                
        /*
        Connexion d'un utilisateur.
        Retourne l'instance de l'utilisateur, ou null
        */
        public static function Logon($pMail, $pPassword)
        {		
           $utilisateur = self::GetUtilisateurByMail($pMail);
  
           if ($utilisateur != null)
           {
              if ($utilisateur->MotDePasse == $pPassword)
              {
                 return $utilisateur;
              }
           }
  
           return null;
        }


                
        /*
        Obtient un utilisateur.
        */
        public static function GetUtilisateurByID($pID)
        {
            
           $data = BDD::requete("SELECT * FROM utilisateurs WHERE ID='" . $pID."'");
           if ($data != false && $utilisateur = mysql_fetch_array($data))
           {
              $newUtilisateur = new ClassUtilisateur();
              $newUtilisateur->ID = $utilisateur["ID"];
              $newUtilisateur->Nom = $utilisateur["Nom"];
              $newUtilisateur->Prenom = $utilisateur["Prenom"];
              $newUtilisateur->Mail = $utilisateur["Mail"];
              $newUtilisateur->Genre = $utilisateur["Genre"];
              $newUtilisateur->DateNaissance = $utilisateur["DateNaissance"];
              $newUtilisateur->InfosPersonnellesPublique = $utilisateur["InfosPersonnellesPubliques"];
              $newUtilisateur->MurPublic = $utilisateur["MurPublic"];
              $newUtilisateur->AffichePostAutreUtilisateur = $utilisateur["AffichePostAutreUtilisateur"];
              $newUtilisateur->LienPhoto = $utilisateur["LienPhoto"];
              $newUtilisateur->MotDePasse = $utilisateur["MotDePasse"];
              
              return $newUtilisateur;
           }
           else
           {
               
              return null;
           }
        }
                
        /*
        Obtient un utilisateur.
        */
        public static function GetUtilisateurByMail($pMail)
        {
            
           $data = BDD::requete("SELECT * FROM utilisateurs WHERE Mail='" . $pMail."'");
		   
           if ($data != false && $utilisateur = mysql_fetch_array($data))
           {
              $newUtilisateur = new ClassUtilisateur();
              $newUtilisateur->ID = $utilisateur["ID"];
              $newUtilisateur->Nom = $utilisateur["Nom"];
              $newUtilisateur->Prenom = $utilisateur["Prenom"];
              $newUtilisateur->Mail = $utilisateur["Mail"];
              $newUtilisateur->Genre = $utilisateur["Genre"];
              $newUtilisateur->DateNaissance = $utilisateur["DateNaissance"];
              $newUtilisateur->InfosPersonnellesPublique = $utilisateur["InfosPersonnellesPubliques"];
              $newUtilisateur->MurPublic = $utilisateur["MurPublic"];
              $newUtilisateur->AffichePostAutreUtilisateur = $utilisateur["AffichePostAutreUtilisateur"];
              $newUtilisateur->LienPhoto = $utilisateur["LienPhoto"];
              $newUtilisateur->MotDePasse = $utilisateur["MotDePasse"];
              
              return $newUtilisateur;
           }
           else
           {
               
              return null;
           }
        }
                
        /*
        Creer un utilisateur.
		Retourne true ou false si l'utilisateur n'a pas pu etre ajouté (utilisateur existe deja).
        */
        public static function AddUtilisateur($pNom, $pPrenom, $pPassword, $pMail, $pDateNaissance, $pLienPhoto, $pGenre)
        {	
			$utilisateur = self::GetUtilisateurByMail($pMail);
		
			if ($utilisateur == null)
			{				
				$lParametre = "Nom,Prenom,DateNaissance,InfosPersonnellesPubliques,MurPublic,AffichePostAutreUtilisateur,LienPhoto,Mail,MotDePasse,Genre";
				$lValues = "'".$pNom."', '".$pPrenom."', '".$pDateNaissance."', 1, 1, 1, '".$pLienPhoto."', '".$pMail."', '".$pPassword."', '".$pGenre."'";
				$lSql = "INSERT INTO utilisateurs (".$lParametre.") VALUES (".$lValues.")";
				
				$data = BDD::requete($lSql);
				
				return $data;
			}
			else
				return false;
        }
                
        /*
        Modifie un utilisateur.
        */
        public static function UpdateUtilisateur($pUtilisateur)
        {
             $requete = "UPDATE utilisateurs SET ";
             $requete .= "Nom=\"" . $pUtilisateur->Nom . "\", ";
             $requete .= "Prenom=\"" . $pUtilisateur->Prenom . "\", ";
             $requete .= "MotDePasse=\"" . $pUtilisateur->MotDePasse . "\", ";
             $requete .= "Mail=\"" . $pUtilisateur->Mail . "\", ";
             $requete .= "DateNaissance=\"" . $pUtilisateur->DateNaissance . "\", ";
             $requete .= "LienPhoto=\"" . $pUtilisateur->LienPhoto . "\", ";
             $requete .= "Genre=\"" . $pUtilisateur->Genre . "\", ";
             $requete .= "InfosPersonnellesPubliques=\"" . $pUtilisateur->InfosPersonnellesPublic . "\", ";
             $requete .= "MurPublic=\"" . $pUtilisateur->MurPublique . "\", ";
             $requete .= "AffichePostAutreUtilisateur=\"" . $pUtilisateur->AffichePostAutreUtilisateur . "\", ";
             $requete .= "WHERE ID=\"" . $pUtilisateur->ID . "\"";
			
            return BDD::requete($requete);
        }
                        
        /*
        Recherche d'utilisateurs par rapport au critères (nom, prenom, mail).
        */
        public static function RechercheUtilisateur($pInfo)
        {
             $pInfo = htmlspecialchars($pInfo, ENT_NOQUOTES);
            $utilisateursList = array();
			$data = BDD::requete("SELECT * FROM utilisateurs WHERE Nom LIKE \"%" . $pInfo . "%\" OR Prenom LIKE \"%" . $pInfo . "%\" OR Mail LIKE \"%" . $pInfo . "%\"");
           if ($data != false)
           {
				while ($utilisateur = mysql_fetch_array($data))
				{
				  $newUtilisateur = new ClassUtilisateur();
				  $newUtilisateur->ID = $utilisateur["ID"];
				  $newUtilisateur->Nom = $utilisateur["Nom"];
				  $newUtilisateur->Prenom = $utilisateur["Prenom"];
				  $newUtilisateur->Mail = $utilisateur["Mail"];
				  $newUtilisateur->Genre = $utilisateur["Genre"];
				  $newUtilisateur->DateNaissance = $utilisateur["DateNaissance"];
				  $newUtilisateur->InfosPersonnellesPublique = $utilisateur["InfosPersonnellesPubliques"];
				  $newUtilisateur->MurPublic = $utilisateur["MurPublic"];
				  $newUtilisateur->AffichePostAutreUtilisateur = $utilisateur["AffichePostAutreUtilisateur"];
				  $newUtilisateur->LienPhoto = $utilisateur["LienPhoto"];
				  $newUtilisateur->MotDePasse = $utilisateur["MotDePasse"];
				  
				  $utilisateursList[] = $newUtilisateur;
			  }
              
              return $utilisateursList;
           }
           else
           {
               
              return null;
           }
        }
}

?>
